package com.nami.framework.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.web.session.HttpSessionEventPublisher;
import org.springframework.session.FindByIndexNameSessionRepository;
import org.springframework.session.Session;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.security.SpringSessionBackedSessionRegistry;

/**
 * 实现Session会话的集群管理.
 * <p>
 * <p>
 * Session默认过期时间，单位为秒，默认30分钟
 * int maxInactiveIntervalInSeconds() default MapSession.DEFAULT_MAX_INACTIVE_INTERVAL_SECONDS;
 * <p>
 * Defines a unique namespace for keys.
 * 配置session key的命名前缀，默认是spring
 * String redisNamespace() default RedisIndexedSessionRepository.DEFAULT_NAMESPACE;
 * <p>
 * 配置刷新Redis中Session的方式，默认是ON_SAVE模式，只有当Response提交后才会将Session提交到Redis
 * 也可以配置成IMMEDIATE模式，所有对Session的更改会立即更新到Redis
 * RedisFlushMode redisFlushMode() default RedisFlushMode.ON_SAVE;
 * <p>
 * <p>
 * 同 redisFlushMode
 * FlushMode flushMode() default FlushMode.ON_SAVE;
 * <p>
 * <p>
 * 清理过期Session的定时任务默认一分钟一次
 * String cleanupCron() default RedisHttpSessionConfiguration.DEFAULT_CLEANUP_CRON;
 * <p>
 * 只有在更改的时候才进行保存；
 * SaveMode saveMode() default SaveMode.ON_SET_ATTRIBUTE;
 *
 * @author C
 */
@Configuration
@EnableRedisHttpSession
public class HttpSessionConfig<S extends Session> {


    /**
     * 提供HttpSessionEventPublisher实例。Spring security中通过一个Map集合来维护当前的HttpSession记录，进而实现
     * 会话的并发管理。当用户登录成功时，就向集合中添加一条HttpSession记录；当会话销毁时，就从集合中移除一条HttpSession
     * 记录。HttpSessionEventPublisher实现了HttpSessionListener接口，可以监听到HttpSession的创建和销毁事件，并将
     * HttpSession的创建/销毁事件发布出去，这样，当有HttpSession销毁时，spring security就可以感知到该事件了
     */
    @Bean
    public HttpSessionEventPublisher httpSessionEventPublisher() {
        return new HttpSessionEventPublisher();
    }
}
